#ifndef __Utilisateur
#define __Utilisateur

#include "ClefPublique.h"
#include "ClefPrivee.h"

#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
#include <string.h>
#include <glib-2.0/glib.h>
#include <assert.h>

struct sUtilisateur
{
    char Nom[20];
    char Prenom[20];
    char Password[20];
    ClefPublique *pClefPublique;
    ClefPrivee *pClefPrivee;
};

typedef struct sUtilisateur Utilisateur;

/** @brief Renvoie le champ nom de la structure Utilisateur */
char * utilisateurGetNom(Utilisateur *pUtilisateur);

/** @brief Renvoie le champ nom de la structure Utilisateur en interdisant toutes modifications */
const char * utilisateurGetNom2(const Utilisateur *pUtilisateur);

/** @brief Modifie le champ nom de la structure Utilisateur*/
void utilisateurSetNom(Utilisateur *pUtilisateur, const char *Nom);

/** @brief Renvoie le champ prenom de la structure Utilisateur */
char * utilisateurGetPrenom(Utilisateur *pUtilisateur);

/** @brief Renvoie le champ prenom de la structure Utilisateur en interdisant toutes modifications */
const char * utilisateurGetPrenom2(const Utilisateur *pUtilisateur);

/** @brief Modifie le champ prenom de la structure Utilisateur */
void utilisateurSetPrenom(Utilisateur *pUtilisateur, const char* Prenom);

/** @brief Renvoie le champ mot de passe de la structure Utilisateur */
char * utilisateurGetPassword(Utilisateur *pUtilisateur);

/** @brief Renvoie le champ mot de passe de la structure Utilisateur en interdisant toutes modifications */
const char * utilisateurGetPassword2(const Utilisateur *pUtilisateur);

/** @brief Modifie le champ mot de passe de la structure Utilisateur */
void utilisateurSetPassword(Utilisateur *pUtilisateur, const char* Password);

/** @brief Renvoie champ clef publique de la structure Utilisateur */
ClefPublique* utilisateurGetClefPublique(Utilisateur *pUtilisateur);

/** @brief Renvoie champ clef publique de la structure Utilisateur en interdisant toutes modifications */
const ClefPublique* utilisateurGetClefPublique2(const Utilisateur *pUtilisateur);

/** @brief Modifie champ clef publique de la structure Utilisateur */
void utilisateurSetClefPublique(Utilisateur *pUtilisateur, const mpz_t n1, const mpz_t c1);

/** @brief Crée et modifie champ clef publique de la structure Utilisateur */
void utilisateurCreerClefPublique(Utilisateur *pUtilisateur);

/** @brief Renvoie champ clef privée de la structure Utilisateur */
ClefPrivee* utilisateurGetClefPrivee(Utilisateur *pUtilisateur);

/** @brief Renvoie champ clef privée de la structure Utilisateur en interdisant toutes modifications */
const ClefPrivee* utilisateurGetClefPrivee2(const Utilisateur *pUtilisateur);

/** @brief Modifie champ clef privée de la structure Utilisateur */
void utilisateurSetClefPrivee(Utilisateur *pUtilisateur, const mpz_t u1, const mpz_t n1);

/** @brief Crée et modifie champ clef privee de la structure Utilisateur */
void utilisateurCreerClefPrivee(Utilisateur *pUtilisateur);

/** @brief Compare deux utilisateurs selon leur nom par rapport à l'ordre alphabétique*/
int utilisateurComparer(gconstpointer c1, gconstpointer c2);

/** @brief Initialise une structure utilisateur sans initialiser les champs ClefPublique et ClefPrivee*/
void utilisateurInitialiser(Utilisateur** pUtilisateur);

/** @brief Initialise une structure utilisateur en initialisant les champs ClefPublique et ClefPrivee*/
void utilisateurInitialiser2(Utilisateur** pUtilisateur);

/** @brief Libère une structure utilisateur*/
void utilisateurLiberer(Utilisateur* pUtilisateur);

/** @brief Remplit les champs d'une structure utilisateur (mode texte)*/
void utilisateurSaisir(Utilisateur* pUtilisateur);

/** @brief Affiche les champs d'une structure utilisateur (mode texte)*/
void utilisateurAfficher(const Utilisateur* pUtilisateur);

/** @brief Test le module Utilisateur*/
void testRegressionUtilisateur();

#endif

